home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / new_file / mintprgs / mint112s / mint112s.lzh / quickmov.spp < prev    next >
Encoding:
Text File  |  1994-08-30  |  2.7 KB  |  123 lines

  1. ; Copyright 1992 Eric R. Smith
  2. ; Copyright 1993 Atari Corporation
  3. ; All rights reserved.
  4. ;
  5. ; quickmove(char *dst, char *src, long nbytes):
  6. ; quickly copy "nbytes" bytes from src to dst. Assumes that both
  7. ; src and dst are word aligned.
  8. ;
  9. ; quickmovb(char *dst, char *src, long nbytes):
  10. ; like memcpy, does unaligned too...  does not check for overlap (memmove).
  11. ;
  12.     TEXT
  13.  
  14.     XDEF    _quickmove
  15.     XDEF    _quickmovb
  16.  
  17. ;%ifdef OWN_LIB
  18.     XDEF    _bcopy
  19.     XDEF    __bcopy
  20.     XDEF    _memcpy
  21.  
  22. _bcopy:
  23. __bcopy:
  24.     move.l    8(sp),a0        ; get dst
  25.     move.l    4(sp),a1        ; get src
  26.     bra.s    _quickmovb1
  27. ;%endif
  28.  
  29. ; for gcc >= 2.5.8
  30. _memcpy:
  31.  
  32. _quickmovb:
  33.     move.l    4(sp),a0        ; get dst
  34.     move.l    8(sp),a1        ; get src
  35. _quickmovb1:
  36.     move.w    a0,d0
  37.     move.w    a1,d1
  38.     eor.w    d1,d0            ; bit 0 == unaligned
  39.     lsr.w    #1,d0            ; ...now in x flag
  40.     move.l    12(sp),d0        ; get nbytes
  41.     beq        Ldone
  42.     roxr.w    #1,d1            ; bit 0 == both odd, msb == unaligned
  43.     bmi        bytecopy        ; unaligned, do the slow thing...
  44.     bcc.s    quickmov1        ; both even, ok
  45.     subq.l    #1,d0            ; both odd, can be fixed
  46.     move.b    (a1)+,(a0)+
  47.     bra.s    quickmov1
  48.  
  49. _quickmove:
  50.     move.l    4(sp),a0        ; get dst
  51.     move.l    8(sp),a1        ; get src
  52.     move.l    12(sp),d0        ; get nbytes
  53. quickmov1:
  54.     move.w    #$1ff,d1
  55.     and.w    d0,d1            ; d1 = nbytes % 512
  56.     lsr.l    #8,d0            ; 
  57.     lsr.l    #1,d0            ; d0 = nbytes / 512
  58.     ble.s    Leftover        ; if <= 0, skip
  59.  
  60.     movem.l    d1-d7/a2-a6,-(sp)    ; save regs
  61. L1:
  62.     movem.l    (a1)+,d1-d7/a2-a6    ; read 12*4 = 48 bytes
  63.     movem.l    d1-d7/a2-a6,(a0)    ;
  64.     movem.l    (a1)+,d1-d7/a2-a6    ; 2nd read
  65.     movem.l    d1-d7/a2-a6,48(a0)    ;
  66.     movem.l    (a1)+,d1-d7/a2-a6    ; 3rd read
  67.     movem.l    d1-d7/a2-a6,96(a0)    ;
  68.     movem.l    (a1)+,d1-d7/a2-a6    ; 4th read
  69.     movem.l    d1-d7/a2-a6,144(a0)    ;
  70.     movem.l    (a1)+,d1-d7/a2-a6    ; 5th
  71.     movem.l    d1-d7/a2-a6,192(a0)    ;
  72.     movem.l    (a1)+,d1-d7/a2-a6    ; 6th
  73.     movem.l    d1-d7/a2-a6,240(a0)    ;
  74.     movem.l    (a1)+,d1-d7/a2-a6    ; 7th
  75.     movem.l    d1-d7/a2-a6,288(a0)    ;
  76.     movem.l    (a1)+,d1-d7/a2-a6    ; 8th
  77.     movem.l    d1-d7/a2-a6,336(a0)    ;
  78.     movem.l    (a1)+,d1-d7/a2-a6    ; 9th
  79.     movem.l    d1-d7/a2-a6,384(a0)    ;
  80.     movem.l    (a1)+,d1-d7/a2-a6    ; 10th
  81.     movem.l    d1-d7/a2-a6,432(a0)    ; At this point, 480 bytes done
  82.     movem.l    (a1)+,d1-d7/a2        ; Only do 32 more bytes
  83.     movem.l    d1-d7/a2,480(a0)    ; for a total of 512
  84.  
  85.     lea    512(a0),a0
  86.     subq.l    #1,d0
  87.     bgt.s    L1
  88.  
  89.     movem.l    (sp)+,d1-d7/a2-a6    ; pop registers
  90.  
  91. Leftover:                ; do the remaining bytes
  92.     moveq.l    #3,d0
  93.     and.w    d1,d0
  94.     lsr.w    #2,d1
  95.     subq.w    #1,d1            ; prepare for dbra loop
  96.     bmi.s    L4done
  97.     lsr.w    #1,d1
  98.     bcc.s    L23
  99. L2l:
  100.     move.l    (a1)+,(a0)+
  101. L23:
  102.     move.l    (a1)+,(a0)+
  103.     dbra    d1,L2l
  104. L4done:
  105.     subq.w    #1,d0            ; prepare for dbra loop
  106.     bmi.s    Ldone
  107. L2:
  108.     move.b    (a1)+,(a0)+
  109.     dbra    d0,L2
  110. Ldone:
  111.     rts                ; return
  112.  
  113. bytecopy:
  114.     subq.l    #1,d0            ; prepare for dbra loop
  115.     move.l    d0,d1
  116.     swap    d1
  117. L3:
  118.     move.b    (a1)+,(a0)+
  119.     dbra    d0,L3
  120.     dbra    d1,L3
  121.     rts                ; return
  122.     END
  123.